package com.regent.central.bill.service;

import com.regent.central.bill.common.ActionType;
import com.regent.central.bill.core.SaleOrderAction;
import com.regent.central.bill.dto.sale_order.SaleOrderActionDTO;
import com.regent.central.infrastructure.common.OrderAs;
import com.regent.central.infrastructure.service.DomainService;

import java.util.List;

public interface SaleOrderActionService extends DomainService<SaleOrderAction> {

    /**
     * 获取销售单的操作记录列表
     *
     * @param saleOrderId     销售单ID
     * @param startSearchTime 开始搜索时间
     * @param orderBy         排序字段
     * @param orderAs         排序方式
     * @param pageNo          页码
     * @param pageSize        每页最大条数
     * @return 销售单的操作记录列表
     */
    List<SaleOrderActionDTO> getPagedSaleOrderActions(
            String saleOrderId,
            String startSearchTime,
            String orderBy,
            OrderAs orderAs,
            int pageNo,
            int pageSize
    );

    /**
     * 撤销销售单动作
     *
     * @param saleOrderActionId 销售单动作ID
     * @param userCanceled      撤销人
     */
    void cancel(String saleOrderActionId, String userCanceled);

    /**
     * 撤销销售单动作
     *
     * @param saleOrderActionId 销售单动作ID
     * @param userCanceled      撤销人
     */
    void cancelChildren(String saleOrderActionId, String userCanceled);

    /**
     * 根据动作的数据ID和动作类型查询销售单动作记录
     *
     * @param actionType 动作类型
     * @param actionId   动作数据ID
     * @return 销售单动作记录
     */
    SaleOrderAction selectBy(ActionType actionType, String actionId);

    /**
     * 根据销售单ID和动作类型查询销售单动作
     *
     * @param saleOrderId 销售单ID
     * @param actionType  动作类型
     * @return 销售单动作
     */
    SaleOrderAction selectByOrderIdAndActionType(String saleOrderId, ActionType actionType);

    /**
     * 根据销售单ID和动作类型查询销售单动作
     *
     * @param saleOrderId 销售单ID
     * @param actionType  动作类型
     * @return 销售单动作
     */
    List<SaleOrderAction> listByOrderIdAndActionType(String saleOrderId, ActionType actionType);

    /**
     * 获取销售单的某个发货单的发货货品动作记录
     *
     * @param saleOrderId 销售单ID
     * @param deliveryId  发货单ID
     * @return 该销售单的某个发货单的发货货品动作记录
     */
    List<SaleOrderAction> getSaleOrderDeliveryGoodsActions(
            String saleOrderId,
            String deliveryId
    );

    /**
     * 根据销售单ID和actionId进行撤销操作
     *
     * @param actionType   动作类型
     * @param userCanceled 撤销人
     * @param actionIds    动作ID
     */
    void cancel(
            ActionType actionType,
            String userCanceled,
            String... actionIds
    );

    /**
     * 获取 Delivery  actionId
     *
     * @param deliveryOrderId
     * @return
     */
    List<SaleOrderAction> getSaleOrderDeliveryActions(String deliveryOrderId);

    /**
     * 获取销售单动作列表
     *
     * @param saleOrderId 销售单ID
     * @param parent      是否是父动作
     * @return 销售单动作列表
     */
    List<SaleOrderAction> getSaleOrderAllActions(String saleOrderId, Boolean parent);

    /**
     * 获取销售单动作列表
     *
     * @param saleOrderId 销售单ID
     * @param parent      是否是父动作
     * @param canceled    已撤销
     * @param deleted     已删除
     * @return 销售单动作列表
     */
    List<SaleOrderAction> getSaleOrderAllActions(String saleOrderId, Boolean parent, Boolean canceled, Boolean deleted);

}